package cn.xd.common.enums;

import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.NonNull;

import java.util.EnumSet;

/**
 * @author mirzaLin
 * @date 2023/11/13
 * @description 枚举通用接口
 **/
public interface IBaseEnum<T> {

    T getCode();

    String getInfo();

    static <E extends Enum<E> & IBaseEnum<?>> E getEnumByCode(@NonNull Object code, Class<E> clazz) {
        EnumSet<E> allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举
        return allEnums.stream()
                .filter(e -> ObjUtil.equal(e.getCode(), code))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据文本标签获取值
     *
     * @param code
     * @param clazz
     * @param <E>
     * @return
     */
    static <E extends Enum<E> & IBaseEnum<?>> String getInfoByCode(@NonNull Object code, Class<E> clazz) {
        EnumSet<E> allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举
        E matchEnum = allEnums.stream()
                .filter(e -> ObjectUtil.equal(e.getCode(), code))
                .findFirst()
                .orElse(null);

        String label = null;
        if (matchEnum != null) {
            label = matchEnum.getInfo();
        }
        return label;
    }

    /**
     * 根据文本标签获取值
     *
     * @param info
     * @param clazz
     * @param <E>
     * @return
     */
    static <E extends Enum<E> & IBaseEnum<?>> Object getCodeByInfo(@NonNull String info, Class<E> clazz) {
        EnumSet<E> allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举
        E matchEnum = allEnums.stream()
                .filter(e -> ObjectUtil.equal(e.getInfo(), info))
                .findFirst()
                .orElse(null);

        Object value = null;
        if (matchEnum != null) {
            value = matchEnum.getCode();
        }
        return value;
    }
}
